{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 573,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from datetime import date\n",
    "from sklearn.ensemble import GradientBoostingClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import roc_auc_score\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:45:50.839554800Z",
     "start_time": "2024-09-23T13:45:50.749947800Z"
    }
   },
   "id": "initial_id"
  },
  {
   "cell_type": "code",
   "execution_count": 574,
   "outputs": [
    {
     "data": {
      "text/plain": "   User_id  Merchant_id Coupon_id Discount_rate Distance Date_received  \\\n0  1439408         2632      null          null        0          null   \n1  1439408         4663     11002        150:20        1      20160528   \n2  1439408         2632      8591          20:1        0      20160217   \n3  1439408         2632      1078          20:1        0      20160319   \n4  1439408         2632      8591          20:1        0      20160613   \n\n       Date  \n0  20160217  \n1      null  \n2      null  \n3      null  \n4      null  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>User_id</th>\n      <th>Merchant_id</th>\n      <th>Coupon_id</th>\n      <th>Discount_rate</th>\n      <th>Distance</th>\n      <th>Date_received</th>\n      <th>Date</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1439408</td>\n      <td>2632</td>\n      <td>null</td>\n      <td>null</td>\n      <td>0</td>\n      <td>null</td>\n      <td>20160217</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>1439408</td>\n      <td>4663</td>\n      <td>11002</td>\n      <td>150:20</td>\n      <td>1</td>\n      <td>20160528</td>\n      <td>null</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>1439408</td>\n      <td>2632</td>\n      <td>8591</td>\n      <td>20:1</td>\n      <td>0</td>\n      <td>20160217</td>\n      <td>null</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>1439408</td>\n      <td>2632</td>\n      <td>1078</td>\n      <td>20:1</td>\n      <td>0</td>\n      <td>20160319</td>\n      <td>null</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>1439408</td>\n      <td>2632</td>\n      <td>8591</td>\n      <td>20:1</td>\n      <td>0</td>\n      <td>20160613</td>\n      <td>null</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 574,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# keep_default_na=False 读取CSV文件时，不会将默认的缺失值（如空字符串）转换为pandas的NaN值。\n",
    "off_train = pd.read_csv('D:\\PycharmProjects\\pythonProject\\data\\ccf_offline_stage1_train.csv',keep_default_na=False,encoding='utf-8')\n",
    "off_test = pd.read_csv('D:\\PycharmProjects\\pythonProject\\data\\ccf_offline_stage1_test_revised.csv',keep_default_na=False,encoding='utf-8')\n",
    "\n",
    "off_train.head(5)\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:45:51.444133300Z",
     "start_time": "2024-09-23T13:45:50.760459500Z"
    }
   },
   "id": "61f53febdbf6bfcf"
  },
  {
   "cell_type": "code",
   "execution_count": 575,
   "outputs": [],
   "source": [
    "# 填充缺失值\n",
    "off_train = off_train.fillna('null')\n",
    "off_test = off_test.fillna('null')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:45:52.256976400Z",
     "start_time": "2024-09-23T13:45:51.445164100Z"
    }
   },
   "id": "862b626a1a0b1112"
  },
  {
   "cell_type": "code",
   "execution_count": 576,
   "outputs": [],
   "source": [
    "# 用label列标记分类，label的取值为1表示正样本，0表示负样本，-1表示普通用户\n",
    "def label(row):\n",
    "    if row['Date'] != 'null' and row['Date_received'] != 'null':\n",
    "        if row['Coupon_id'] != 'null':\n",
    "            # 优惠券id不为空，表示使用了优惠券购买\n",
    "            # 计算使用优惠券的日期差值\n",
    "            td = pd.to_datetime(row['Date'], format='%Y%m%d') - \\\n",
    "                 pd.to_datetime(row['Date_received'], format='%Y%m%d')\n",
    "            if td <= pd.Timedelta(15, 'D'):  # 判断使用优惠券是否在15天内\n",
    "                return 1\n",
    "            else:\n",
    "                return 0\n",
    "        else:\n",
    "            # 其他情况：优惠券id为null，表示没有使用优惠券购买\n",
    "            return 0\n",
    "    if row['Date'] == 'null' and row['Date_received'] != 'null':\n",
    "        return 0\n",
    "    else:\n",
    "        return -1"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:45:52.273134300Z",
     "start_time": "2024-09-23T13:45:52.259968700Z"
    }
   },
   "id": "a44b7221a2abcd73"
  },
  {
   "cell_type": "code",
   "execution_count": 577,
   "outputs": [
    {
     "data": {
      "text/plain": " 0    988887\n-1    701602\n 1     64395\nName: label, dtype: int64"
     },
     "execution_count": 577,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对lable分类\n",
    "off_train['label'] = off_train.apply(label, axis = 1)\n",
    "off_train['label'].value_counts()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:18.761770500Z",
     "start_time": "2024-09-23T13:45:52.275132300Z"
    }
   },
   "id": "3cd2a3741e39fe43"
  },
  {
   "cell_type": "code",
   "execution_count": 578,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "label为1的数目： 64395\n",
      "label为0的数目： 988887\n",
      "总数： 1053282\n",
      "抽样label为1的数目： 64395\n",
      "随机抽取label为0的数目： 64395\n",
      "抽样总数： 128790\n",
      "总样本形状： (128790, 8)\n"
     ]
    }
   ],
   "source": [
    "X = off_train.loc[:,off_train.columns != 'label']  # 数据\n",
    "y = off_train.loc[:,off_train.columns == 'label']  # 标签\n",
    "\n",
    "# 获取类1标签的长度\n",
    "count_one_Class = len(off_train[off_train['label'] == 1])\n",
    "\n",
    "# 获取两类标签的索引\n",
    "one_Class_index = off_train[off_train['label'] == 1].index\n",
    "zero_Class_index = off_train[off_train['label'] == 0].index\n",
    "\n",
    "# 随机选择相同数目的索引\n",
    "np.random.seed(25)  # 定义随机种子\n",
    "random_zero_index = np.array(np.random.choice(zero_Class_index,count_one_Class,replace=True))\n",
    "\n",
    "# 合并模型样本索引\n",
    "sample = np.concatenate([one_Class_index,random_zero_index])\n",
    "\n",
    "# 按照索引获取行\n",
    "off_train = off_train.loc[sample,:]\n",
    "# 打印结果对比\n",
    "print('label为1的数目：', len(one_Class_index))\n",
    "print('label为0的数目：', len(zero_Class_index))\n",
    "print('总数：', len(one_Class_index) + len(zero_Class_index))\n",
    "print('抽样label为1的数目：', len(one_Class_index))\n",
    "print('随机抽取label为0的数目：', len(random_zero_index))\n",
    "print('抽样总数：', len(one_Class_index) + len(random_zero_index))\n",
    "print('总样本形状：', off_train.shape)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:18.995433900Z",
     "start_time": "2024-09-23T13:46:18.764026700Z"
    }
   },
   "id": "352489b5cd664465"
  },
  {
   "cell_type": "code",
   "execution_count": 579,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['User_id', 'Merchant_id', 'Coupon_id', 'Discount_rate', 'Distance',\n",
      "       'Date_received'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "# 探索性分析\n",
    "print(off_test.columns)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.008042800Z",
     "start_time": "2024-09-23T13:46:18.993288Z"
    }
   },
   "id": "c60988844eb6d72"
  },
  {
   "cell_type": "code",
   "execution_count": 580,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "查看缺失值结果：\n",
      " User_id          0\n",
      "Merchant_id      0\n",
      "Coupon_id        0\n",
      "Discount_rate    0\n",
      "Distance         0\n",
      "Date_received    0\n",
      "Date             0\n",
      "label            0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "# 变换距离的类型，缺失值替换为-1\n",
    "off_train['Distance'] = off_train['Distance'].replace('null', -1).astype(int)\n",
    "off_test['Distance'] = off_test['Distance'].replace('null', -1).astype(int)\n",
    "print('查看缺失值结果：\\n',off_train.isnull().sum())"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.084940700Z",
     "start_time": "2024-09-23T13:46:19.010681100Z"
    }
   },
   "id": "9d10c771d15c9336"
  },
  {
   "cell_type": "code",
   "execution_count": 581,
   "outputs": [],
   "source": [
    "description = off_train.describe()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.131935900Z",
     "start_time": "2024-09-23T13:46:19.086965400Z"
    }
   },
   "id": "3f86318e0719b4c0"
  },
  {
   "cell_type": "code",
   "execution_count": 582,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "描述性统计结果：\n",
      "           User_id  Merchant_id   Distance     label\n",
      "count   128790.00    128790.00  128790.00  128790.0\n",
      "mean   3697459.80      4077.69       1.85       0.5\n",
      "std    2123423.03      2471.02       3.36       0.5\n",
      "min        110.00         3.00      -1.00       0.0\n",
      "25%    1859343.75      1941.00       0.00       0.0\n",
      "50%    3698645.00      3621.00       0.00       0.5\n",
      "75%    5543521.50      6434.00       2.00       1.0\n",
      "max    7360941.00      8856.00      10.00       1.0\n",
      "range  7360831.00      8853.00      11.00       1.0\n",
      "var   -1574036.77     -1606.67       1.51       0.0\n",
      "dis    3684177.75      4493.00       2.00       1.0\n",
      "相关系数矩阵为：\n",
      "              User_id  Merchant_id  Distance  label\n",
      "User_id          1.0         0.00     -0.00   0.00\n",
      "Merchant_id      0.0         1.00     -0.01   0.07\n",
      "Distance        -0.0        -0.01      1.00  -0.33\n",
      "label            0.0         0.07     -0.33   1.00\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\86183\\AppData\\Local\\Temp\\ipykernel_17896\\3907042364.py:7: FutureWarning: The default value of numeric_only in DataFrame.corr is deprecated. In a future version, it will default to False. Select only valid columns or specify the value of numeric_only to silence this warning.\n",
      "  corr = off_train.corr(method = 'pearson')  # 计算相关系数矩阵\n"
     ]
    }
   ],
   "source": [
    "# 依次计算极差值、系数、四分位数间距\n",
    "description.loc['range'] = description.loc['max'] - description.loc['min']\n",
    "description.loc['var'] = description.loc['std'] - description.loc['mean']\n",
    "description.loc['dis'] = description.loc['75%'] - description.loc['25%']\n",
    "print('描述性统计结果：\\n',np.round(description, 2))  # 保留两位小数\n",
    "# 相关性分析\n",
    "corr = off_train.corr(method = 'pearson')  # 计算相关系数矩阵\n",
    "print('相关系数矩阵为：\\n',np.round(corr, 2))  # 保留两位小数\n"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.149810500Z",
     "start_time": "2024-09-23T13:46:19.120381600Z"
    }
   },
   "id": "7f346b1ab72cd114"
  },
  {
   "cell_type": "code",
   "execution_count": 583,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1000x1000 with 2 Axes>",
      "image/png": "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4403lJiYqPPnz8tsNsvb21vVqlXTpEmTbP03b96smjVrSpIt+di5c6cmTZqkkiVLSpImTJigoKAgZWRk3HJG4uTJk5owYYI6deqkf//73+rcubPtdX5+fipWrJjeeecdhYSEaNWqVerQoYN27typpk2bZvp5bNiwQbVr11b16tUNn9GFCxcUFhaWab/U1FQVKVJEiYmJevPNNxUREaHg4GDt379f7du3V/PmzdW1a1e7l3QFABR8JAkA8q0PPvhAzz77rGJiYtSuXTs9++yzMplMSk1N1ZdffilJuuuuu2Q2m5WYmGjrl5aWpk2bNuny5csKDQ1V5cqVde7cOZUuXVrdu3fXnXfemeX7hoWF2ZKEP39db9mypa397NmzOn78uFatWqXZs2fr/fffV5UqVQz7CA8P1xdffGGbJYiPj9e1a9d05MgRHT16VCtWrLAlIz169NClS5eUmpqaaZKQnp6uKVOm3LTs6uHDhxUSEiJ/f/9Mj+fq1as6f/689u7dq5EjR6pkyZJ6+eWXdeedd2r16tUymUwqWbKkxo4dm+XnAgAoPEgSAORL27ZtU3p6ujp16qQRI0ZIuvHFW5IuXbqknj172r4Yr1692vAreOnSpTVgwADD/ubPn6/hw4dr8eLFKleunKpWrZrpez/xxBO2//7nr+snT57UkiVLdOnSJXXr1k3du3fP8jhSUlI0atQoXb9+XSkpKdq+fbumTJkiPz8/23UEQ4YMUWRkpNq1a5fpfhYsWKCmTZuqVq1ahu07d+68ads/Xbx4UeHh4WrdurUk6YsvvlC7du10xx13KCgoSNKNZOjviRYAeAxWN3IJirgA5DsHDx7U8ePHNWjQIEk3fgn/u5MnT+rUqVNavXq1PvvsM8XExGS5vy1btujixYu67777NHjwYL366qs6efJktnEkJSXdtK1ixYoaMGCAbr/99lveP+GfkpOTFRUVpalTpyogIEA9e/ZUenq6Lebr16+rXr16WrlyZaYXHx84cEArV67U0KFDb2r77rvv1Lx58yxjiI+PN8w03H///Zo8ebJWrFhh25aWlqYrV64oPT0922MCABR8JAkA8p2KFSuqS5cutufnzp2T2fzX6er69evau3evgoKC1LBhQ82ePVuhoaG33FdsbKzGjh2r6OhomUwmlStXTj169NCzzz57yzsp/93hw4dtS4Ompqbq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3y5vb29duHDBlsxlZGQoOTlZ165dk5+fn6QbX3z+niBI0pkzZww1/iEhIQoJCbE9r169uoKCgiTJ0Ndqterdd9/V2rVrVaNGDQUEBNi+4GXVzxUSEhIMMed29gy5l56erosXL6pMmTJZvi6z81xWHB17WY11e86rKBjMZrPmzJmjRYsWKTQ0VBUrVjSMn4oVK8psvlFAUaFCBV2/fl0XL15UfHx8tudYoDAiSXCREiVKGGoar1+/rpSUFAUGBurixYuaM2eOLBaLpk6dqjfeeEPLli1TSEiIWrdubfsFIyMjQykpKYb9+vv7Oy3GMmXKKCEhwfb89OnTTts3HPfnsqfdunXT9u3blZ6ernr16mnixImSbnyRSkpKkrf3X//3vdW4KF++vH7++Wfb86NHj+rVV1+1rSAUEBBwy/dfvny5fv75Z23atEnFihXTZ599Zqj9zqzfn+z5ldleZcqU0cGDB23PGaPu9/PPP8tkMqlevXqZvubq1atKSUm55XnuT7caJ46OvazGuj3nVRQMP/30kz7//HOtXbtWQUFB2rRpk+H+QGfOnJHVapXJZFJ8fLy8vLxUsmRJhYSEZHuORf5m8vS6nnyKaxJcpGHDhjp//rwWLFig+Ph4vffeeypVqpQqVqyol156Sd98840uXrwos9ls+6Xjscce086dO/XHH39IkubNm6fIyEiXxdimTRstW7ZMv/zyi3777TctXLjQZe8F+/15Eeif//b399epU6e0e/dueXl5aeXKlXrhhRey/SL+6KOPateuXVqyZIlOnz6t6dOnq0yZMrZf0jJz9epVSdLly5e1adMmTZ8+PUdf+itXrqwffvhBCQkJ2rZtm939bqVNmzbasmWLNm3apJiYGFt5CfJWRkaGzp07p40bNyoyMlLPPPOMihcvnuXrMzvP/elW48TRsZfVWM/r8yrc58/xk5iYqF27dumdd94xjJ8zZ87oo48+UlxcnN5//321atVK3t7eatWqlUPnWKCgI0lwkaCgIL377rv69NNP9dBDD2nz5s2aPHmyihcvrvHjx2vGjBl64IEHtHHjRo0aNUrSjVKKsWPHauzYsXrsscd06NAh2y8brvDggw/q6aefVt++fTV06FC1adPGZe8F+9WuXVsBAQEKDQ2VdGNW6oMPPtCcOXPUrl07rV27VtOnT8/2V67Q0FBbv0cffVRXrlzR22+/ne37P/nkk6pSpYoeeeQRvf/+++rSpYuOHDmia9eu2RX/kCFD9MMPP6hNmzaaNm2aXX0yU69ePb3++ut688039dJLL+nee+/N1f7gmEOHDunee+/VW2+9pa5du2Zbrx0QEJDpee5Ptxonjo69rMZ6Xp9X4T733nuvWrdurY4dO2rUqFF66qmnlJCQoHPnzkmS6tevr127dql9+/ZKTU21jUlHz7FAQWeykioDAADAQ51NvO7uEDJVtrjnJpueGzkk3VgTunfv3rdsi4iIYFodbnfq1Ck98cQTt2xr0aKFpk6dmscRAQCA7DCT4OGuXbums2fP3rKtWLFiKlWqVB5HBBhdv379ppu4/alIkSK21WoAAHAEMwmuQZIAAAAAj3U2KR8nCQGemyRw4TIAAAAAA5IEAAAAAAaeOwcCAACAQo97qbkGMwkAAAAADEgSAAAAABhQbgQAAACPZaLeyCWYSQAAAABgQJIAAAAAwIByIwAAAHgsE+sbuQQzCQAAAAAMSBIAAAAAGFBuBAAAAI/F6kauwUwCAAAAAAOSBAAAAAAGJAkAAAAADEgSAAAAABiQJAAAAAAwYHUjAAAAeCxWN3INZhIAAAAAGJAkAAAAADCg3AgAAAAeyyTqjVyBmQQAAAAABiQJAAAAAAwoNwIAAIDHYnUj12AmAQAAAIABSQIAAAAAA8qNAAAA4LGoNnINZhIAAAAAGJAkAAAAADCg3AgAAACei3ojl2AmAQAAAIABSQIAAAAAA8qNAAAA4LFM1Bu5BDMJAAAAAAxIEgAAAAAYUG4EAAAAj2Wi2sglmEkAAAAAYECSAAAAAMCAciMAAAB4LKqNXIOZBAAAAAAGJAkAAAAADCg3AgAAgOei3sglmEkAAAAAYECSAAAAAMCAciMAAAB4LBP1Ri7BTAIAAAAAA5IEAAAAAAaUGwEAAMBjmag2cglmEgAAAAAYkCQAAAAAMDBZrVaru4MAAAAAkH8wkwAAAADAgCQBAAAAgAFJAgAAAAADkgQAAAAABiQJAAAAAAxIEgAAAAAYkCQAAAAAMCBJAAAAAGBAkgAAAADA4P8B8XXAuWEIvVIAAAAASUVORK5CYII=\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制相关性热力图\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "plt.rcParams['font.sans-serif'] = 'KaiTi'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.subplots(figsize=(10, 10))  # 设置画面大小\n",
    "sns.heatmap(corr, annot=True, vmax=1, square=True, cmap=\"Blues\")\n",
    "plt.title('相关性热力图')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.340869200Z",
     "start_time": "2024-09-23T13:46:19.149810500Z"
    }
   },
   "id": "33e842481a0b5ae6"
  },
  {
   "cell_type": "code",
   "execution_count": 584,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhsAAAGxCAYAAADLSHSoAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAApFElEQVR4nO3de3RU5aH//89OMrlgMiFkEiBGCGAYCxIwiAtELUJEinD8Agel5VBZVg+gclaLdnXBEU1rtQJ61FqlRVGgHKDcBEWst3aVQy1KUbkIhBBACLdcSSYJSSDZvz/4JSWQG2Y/JDN5v9ZyxeyZeeYhe57Nmz2XWLZt2wIAADAkqLUnAAAAAhuxAQAAjCI2AACAUcQGAAAwitgAAABGERsAAMAoYgMAABhFbAAAAKOIDQD1OnHihLZv397a06jX6dOndf78+daeBoBmIjYA1CsqKkqvvPKKli1bdsW33bRpk8rKyupsO3TokMaPH69z5861eG6bN2/W5MmTm3Vd27Z16tQpbdu2TcuXL9cTTzyhSZMm6ZNPPmnxPAA0j8XHlQOBx7ZtFRYWqlOnTnW2FxYW6osvvtCxY8c0ZcoUhYWFNThGcXGxjh49qj179sjn8ykrK0tZWVkaPny4ZsyY0eDtqqqqdMstt2ju3LkKDg5Wz5491bdvX61YsUJLliyR1+vVmTNnlJ6erl69el12+8rKSu3bt09ff/21duzYoX379mnIkCGaO3euDh06JK/Xq507d2rBggVavnz5ZbdftGiR/u///k8DBw5UeHi4vv76a912221KSEhQfHy8rrnmGv35z3/Wyy+/rD/96U8aMGBA83+wAL6TkNaeAABnHDp0SNu2bdOZM2dUVlampUuX6vnnn1dwcLDee+89VVZWKjQ0VH379tXgwYPrDY2//e1v+tOf/qSIiAglJSUpMTFRW7duVceOHfX444/Lsix5PJ5G5/HnP/9ZKSkpOnr0qCIiItSzZ0+VlJRo48aNWr58uTwej4KCGj6punv3bs2dO1djx47VD37wA7lcLv3qV7+SJD3yyCN6+eWX1alTpwZDaejQofrqq6/005/+VJI0ZswYuVwuDR8+vPY606dP1+LFixUZGdnUjxWAA4gNIEB07NhR7733nlasWCHLsrRlyxbdfvvtOnLkiKKiovT88883Ocb3v/99xcXFyev1at++fVq3bp0yMzO1bNkyBQUF6a677tK6devUo0ePem9fUFCg9evX67e//a1WrFihCRMmqFOnTnrttdeUnp6uJ554QiNGjNADDzzQ4BwGDhyooUOHqmfPnrr55pv1hz/8Qe+++64sy1JiYqI6deqk0NBQNXRS1uPxyOVySZKOHz+u4uJinThxQqNHj1Z8fLyWLFlSO1ZUVFQzfrIAWorYAAJEp06dFB8fL5/Ppx07digkJESRkZGKiYmpc72ioiKdPXtWXbp0qXecNWvWaOTIkfJ4PKqoqFBycrI2btyofv36qUePHkpKSmpwDjt37tSrr76qDh06qFevXtqzZ4/uuOMOPfroo5Kkt956SydPnqz3tnl5eTp06JD27dunHTt2aPfu3dq0aZMqKysVEhKinj17KiwsTMHBwZKk8vLyesdxuVy111m8eLGmTp2q//iP/9AHH3ygKVOm1F6PsxrA1UNsAAHknnvu0ezZs9W1a1ctWbJEQUFBCgkJUU5Ojt5++20dOXJEGRkZ+uabb/S///u/SklJuWyM/Px8hYeHa9u2bRo1apQKCgp04sQJLVq0SFOmTJFlWQ3e/5133ilJevPNN1VdXa3//M//rHN5SEiIQkNDlZ2drcTExDqXffrppzp8+LAGDBggj8ejZ555RpKUnp6u0aNHS5KGDx+u+Ph4nTp1qsHYqKqqUnBwsA4ePKj7779f586d04QJEzR48GCNGDGi9noul0tVVVXN+KkCaCliAwggI0eOVFJSkl577TW53W5JkmVZCgoK0tixY+XxeFRQUKAJEyaoT58+9Y5RUFCgF198UQMHDtSWLVs0a9Ys3XvvveratavGjh3brHn06tVLmzdv1tatW9WvXz8tXrxYt912myTp3Llzeu6553TPPffokUceqb3N/fffL0kqKSnRkiVLFB8fr927d6tDhw6115k0aZLy8/OVmZmpysrKeu+7urpaISEhuv766yVJf/zjHxUfH6/t27dr/fr1GjdunCzLksvlajBYADiL2AACxPLlyzV48GB16tRJR48e1ZNPPqn7779fHo+n9j9JOnz4sG655RaFhNS//Gve4VFdXa2hQ4dKkg4cOKCwsDAtWLBAMTExmjRpkqKjo+vcbuPGjTp06JCOHj2q/fv3Ky4uTmfPnlVwcLBycnKUkJBQezZj0KBBiouLq/f+X3jhBc2aNav2DIrb7dY///lPpaamKigoSOfPn9dzzz2n5OTkem9/9uzZ2hePLlu2TNnZ2Zo8ebI8Ho+mTZumhQsXauLEiQoKCiI2gKuE2AACRH5+vv7+97/r3nvv1Y033lj7NER2draOHDmiefPm6dSpUyorK1Pfvn0vu/3ixYtVUVGh0NBQnT9/Xt9++62SkpK0c+dOde3aVT179lRiYqIeeOABnT17tvbdHjUGDBig2NhYTZ48WWPGjNFtt92mtLQ0WZalqKgoLVq0SEFBQZozZ47cbrc6duxY5/a2bWvt2rUaP3587dM7KSkp6tWrl4YPH64FCxbojjvuUOfOnfX888/Xnrm51NmzZxUSEqKNGzeqT58++vGPf6wPP/xQv/71r/Xhhx8qNzdXXbt21TfffKPS0tKW/+ABNInYAAJEz5495fP5ZFlW7VmBsrIynTt3TjExMXr00UcbfVFkZWWl4uLiNHHiREnSSy+9pEmTJql///760Y9+pHnz5umGG27Q9773Pd14442X3b579+7q3r27XnrpJQ0ZMkTZ2dkaP368Vq9erfLyck2cOFElJSWqrKyUy+VSRUVFndtbllV73zWqq6tVVFSkmJgY/fOf/9TmzZsVFhamX/7ylw3+OQoLCxUTE6N7771XkpSRkaGDBw/q2Wefldvtro2UoKAgFRcXN+MnC6CliA0gQHg8HuXn5+vbb7/Vl19+qRdffFF33XWXgoODFR0dXSc0aj70KyYmpjZMLv78jJycHG3atEmlpaX6y1/+ol69emnNmjWaNWuWIiIiLnuHS41du3YpOztbw4cP1+nTp3XHHXdIuvAOmD179igiIkKVlZWyLOuyTxi91FtvvaUtW7aoW7duKisrU/fu3ZWWlqauXbs2ertTp04pIiKi9nuv16tVq1bp5z//uTZs2FC7/fz58zpz5kyjYwFwBrEB+DnbtvXBBx/o008/1eeff64xY8bolVdeqf10zo8++kjHjx/Xp59+qr179+rLL79URkaGXC6XRo0apdmzZ0u68MLMmiDJysrSLbfcoh//+Mfq1q2bzp8/r+PHj0u6ECL1nSEpKCjQhg0b9Oyzz2rdunWyLEs33HBD7WXjxo1TXl6eTp48qbKyMp09e7bRP9eDDz6oBx98UJJ033336Z577lF4eHiTP4+srKw673SpqqrSY489ppUrV+of//iHfD6f+vTpo+PH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KjExsfb70NBQxcfH6+TJkxowYMBVm8fp06dVUFCgQYMGSbrwj4nS0lJVVFQoPDxcr7zyin7/+9/rV7/6Ve0/TLp3737V5gdziI12rK0cgGrce++9l4VGUFCQ3n77ba1du1aJiYm69tprVV1d3azxoqOjdcMNN0i68GeTJNu2nZ004AcSEhLqvIujoqJCOTk5zX5nyXdhWdZl661Lly668cYb9T//8z+SLqzHkpIShYSEqLCwUG63W6tWrVJZWZmefvpp/eY3v9Hvf//7RseEf+BplHasrRyAanTo0OGybZ9//rlWrlypzZs3a/369fr3f//3Zt9Xc075Au3BsGHDVFpaqt/97nc6fvy4nn32WSUlJalfv37G7rN79+767LPPlJOTo88++0xVVVUaNmyYTpw4oV27dik4OFibN2/WQw89JNu2VVhYqKlTp2rLli0qKSlRUFDQZf+w6N69u/72t7/p9OnT2r59u7G5w3nERjvWVg5AjSkrK5Mk+Xw+7dixQ7/5zW/4lw1wha655hotXrxYW7du1dixY3XixAm9/vrrCgoy91fAI488ohMnTmjEiBFKT09XdXW13G63Xn/9db399tv6wQ9+oI8//lgLFy5USEiIevbsqV/84hdKT09XWlqaDh8+rJ///Od1xkxPT9fSpUt11113adWqVcbmDufxNEo7VnMAevrpp/XWW28pNTX1qhyAZs2apREjRqhr1656//33FRwc3OD1b7/9dg0fPlzjx49XYmKi7rvvPr344ovKy8tr1bfbAv7G6/U2+Bf0zJkzG7xdY5c1pmvXrlq5cuVl21NSUrRmzZp6bzN58mRNnjy5wTGHDBmijz/++DvNB63LsvlnIgDgCtx88831bk9KSmrWu9PQ/hAbcAwHIKB9aOgjw10uF58yinoRG3AMByAAQH2IDQAAYBTvRgEAAEYRGwAAwChiAwAAGEVsAAAAo4gNAABgFLEBAACMIjYAAIBR/x8xChVihjIgiwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 箱型图\n",
    "off_train['Distance'].isnull().sum()\n",
    "off_test['Distance'].isnull().sum()\n",
    "D1 = np.array(off_train['Distance'].values)\n",
    "D2 = np.array(off_test['Distance'].values)\n",
    "plt.boxplot([D1,D2],labels=('off_train','off_test'))\n",
    "plt.title('距离箱型图')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.479781100Z",
     "start_time": "2024-09-23T13:46:19.339869200Z"
    }
   },
   "id": "999dd13dbdaf44fe"
  },
  {
   "cell_type": "code",
   "execution_count": 585,
   "outputs": [],
   "source": [
    "# 定义函数处理折扣率\n",
    "def convertRate(row):\n",
    "    if row == 'null':\n",
    "        return 1.0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return 1.0 - float(rows[1]) / float(rows[0])\n",
    "    else:\n",
    "        return float(row)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.493701100Z",
     "start_time": "2024-09-23T13:46:19.478781200Z"
    }
   },
   "id": "6052e8edb0d3f6c7"
  },
  {
   "cell_type": "code",
   "execution_count": 586,
   "outputs": [],
   "source": [
    "def getDiscountType(row):\n",
    "    # 如果 row 是浮点数，直接返回一个默认值或根据你的逻辑返回一个值\n",
    "    if isinstance(row, float):\n",
    "        return -1  # 或者其他表示非折扣类型的值\n",
    "    # 如果 row 是字符串，继续进行判断\n",
    "    elif ':' in row:\n",
    "        # 满多少减多少\n",
    "        return 1\n",
    "    else:\n",
    "        # 折扣率\n",
    "        return 0"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.535691500Z",
     "start_time": "2024-09-23T13:46:19.495698100Z"
    }
   },
   "id": "25471cb76779212"
  },
  {
   "cell_type": "code",
   "execution_count": 587,
   "outputs": [],
   "source": [
    "# 定义函数处理满减类型的折扣优惠券\n",
    "def Man_Rate(row):\n",
    "    if row == -1:\n",
    "        return 0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return int(rows[0])\n",
    "    else:\n",
    "        return 0\n",
    "def Jian_Rate(row):\n",
    "    if row == -1:\n",
    "        return 0\n",
    "    elif ':' in str(row):\n",
    "        rows = row.split(':')\n",
    "        return int(rows[1])\n",
    "    else:\n",
    "        return 0"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.535691500Z",
     "start_time": "2024-09-23T13:46:19.509376500Z"
    }
   },
   "id": "dd7f86e9cc2cc45a"
  },
  {
   "cell_type": "code",
   "execution_count": 588,
   "outputs": [],
   "source": [
    "# 调用函数构建跟折扣率相关的四个特征属性\n",
    "off_train['Dis_rate'] = off_train['Discount_rate'].apply(convertRate)\n",
    "off_train['Discount_type'] = off_train['Discount_rate'].apply(getDiscountType)\n",
    "off_train['Discount_man'] = off_train['Discount_rate'].apply(Man_Rate)\n",
    "off_train['Discount_jian'] = off_train['Discount_rate'].apply(Jian_Rate)\n",
    "off_test['Dis_rate'] = off_test['Discount_rate'].apply(convertRate)\n",
    "off_test['Discount_type'] = off_test['Discount_rate'].apply(getDiscountType)\n",
    "off_test['Discount_man'] = off_test['Discount_rate'].apply(Man_Rate)\n",
    "off_test['Discount_jian'] = off_test['Discount_rate'].apply(Jian_Rate)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:19.990459100Z",
     "start_time": "2024-09-23T13:46:19.524131300Z"
    }
   },
   "id": "35f24bd4458b08b4"
  },
  {
   "cell_type": "code",
   "execution_count": 589,
   "outputs": [
    {
     "data": {
      "text/plain": "1    64395\n0    64395\nName: label, dtype: int64"
     },
     "execution_count": 589,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据label标签来提取正、负样本的全部数据\n",
    "data = off_train[off_train['label'] != -1]\n",
    "data = data.fillna(-1)\n",
    "data['label'].value_counts()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:20.084406400Z",
     "start_time": "2024-09-23T13:46:19.992472800Z"
    }
   },
   "id": "3f3f1f4049eec2d8"
  },
  {
   "cell_type": "code",
   "execution_count": 590,
   "outputs": [],
   "source": [
    "# 获取领券日期是星期几，并且构建成特征\n",
    "def getWeekday(row):\n",
    "    if row == 'null':\n",
    "        return row\n",
    "    else:\n",
    "        return date(int(row[0:4]),int(row[4:6]),int(row[6:8])).weekday()+1\n",
    " \n",
    "data['Weekday'] = data['Date_received'].astype(str).apply(getWeekday)\n",
    "off_test['Weekday'] = off_test['Date_received'].astype(str).apply(getWeekday)\n",
    "# 周六日为类型1，其他为0\n",
    "data['Is_weekend'] = data['Weekday'].apply(lambda x: 1 if x in [6,7] else 0)\n",
    "off_test['Is_weekend'] = off_test['Weekday'].apply(lambda x: 1 if x in [6,7] else 0)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:20.396555400Z",
     "start_time": "2024-09-23T13:46:20.087398600Z"
    }
   },
   "id": "7ea5859ca2328d97"
  },
  {
   "cell_type": "code",
   "execution_count": 591,
   "outputs": [],
   "source": [
    "# 跟星期相关的独热编码\n",
    "def One_hot(df):\n",
    "    weekdaycols = ['weekday' + str(i) for i in range(1,8)]\n",
    "    tmpdf = pd.get_dummies(df['Weekday'].replace('null', np.nan))\n",
    "    tmpdf.columns = weekdaycols\n",
    "    df[weekdaycols] = tmpdf\n",
    "    return df\n",
    "data = One_hot(data)\n",
    "off_test = One_hot(off_test)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:20.411469700Z",
     "start_time": "2024-09-23T13:46:20.396555400Z"
    }
   },
   "id": "7641de9908204607"
  },
  {
   "cell_type": "code",
   "execution_count": 592,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\86183\\AppData\\Local\\Temp\\ipykernel_17896\\1497750666.py:5: FutureWarning: The default value of numeric_only in DataFrameGroupBy.sum is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function.\n",
      "  f = f.groupby(['User_id']).agg('sum').reset_index()\n"
     ]
    }
   ],
   "source": [
    "def func(data):\n",
    "    # 提取用户使用的优惠券的数量\n",
    "    f = data[['User_id', 'Coupon_id']].copy()  # 创建一个副本以避免警告\n",
    "    f['rec_coupon'] = 1\n",
    "    f = f.groupby(['User_id']).agg('sum').reset_index()\n",
    "    \n",
    "    # 全部优惠券的数目\n",
    "    f1 = data[['Coupon_id']].copy()  # 创建一个副本以避免警告\n",
    "    l1 = len(f1)\n",
    "    f1['Number_coupon'] = 1\n",
    "    f1 = f1.groupby(['Coupon_id']).agg('sum').reset_index()\n",
    "    # 优惠券的流行度：每一种优惠券占全部优惠券的比例\n",
    "    f1['Coupon_popu'] = f1['Number_coupon'] / l1\n",
    "    \n",
    "    # 提取用户和商家\n",
    "    f2 = data[['User_id','Merchant_id']].copy()  # 创建一个副本以避免警告\n",
    "    l2 = len(f2)\n",
    "    # 提取顾客去商家的数量\n",
    "    f2['Number_merchant'] = 1\n",
    "    f2 = f2.groupby(['Merchant_id']).agg('sum').reset_index()\n",
    "    # 商家的受欢迎度：商家的顾客（用户）占全部商家的顾客（用户）的比例\n",
    "    f2['Merchant_popu'] = f2['Number_merchant'] / l2\n",
    "    \n",
    "    # 合并特征属性\n",
    "    d0 = pd.merge(data, f[['User_id', 'rec_coupon']], on='User_id')\n",
    "    d1 = pd.merge(d0, f1[['Coupon_id', 'Coupon_popu']], on='Coupon_id')\n",
    "    d2 = pd.merge(d1, f2[['Merchant_id', 'Merchant_popu']], on='Merchant_id')\n",
    "    \n",
    "    return d2\n",
    "\n",
    "# 调用以上函数构建相关的三个特征属性\n",
    "new_data = func(data)\n",
    "new_test_data = func(off_test)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:20.738876Z",
     "start_time": "2024-09-23T13:46:20.416483600Z"
    }
   },
   "id": "811c04da7a556304"
  },
  {
   "cell_type": "code",
   "execution_count": 593,
   "outputs": [],
   "source": [
    "# 定义函数得到跟距离相关的特征属性\n",
    "def Get_mer_dis(new_data):\n",
    "    # 查看距离的类别数量\n",
    "    new_data['Distance'].value_counts()\n",
    "    # 提取用户-商家距离的数据集\n",
    "    md1 = new_data[new_data.Coupon_id != 'null'][['Merchant_id', 'Distance']]\n",
    "    md1.replace('null', -1, inplace=True)\n",
    "    md1.replace(-1, np.nan, inplace=True)\n",
    "    # 用户-商家的距离最小值\n",
    "    md2 = md1.groupby('Merchant_id').agg('min').reset_index()\n",
    "    md2.rename(columns={'Distance': 'merchant_min_distance'}, inplace=True)\n",
    "    # 用户-商家的距离最大值\n",
    "    md3 = md1.groupby('Merchant_id').agg('max').reset_index()\n",
    "    md3.rename(columns={'Distance': 'merchant_max_distance'}, inplace=True)\n",
    "    # 用户-商品的距离平均值\n",
    "    md4 = md1.groupby('Merchant_id').agg('mean').reset_index()\n",
    "    md4.rename(columns={'Distance': 'merchant_mean_distance'}, inplace=True)\n",
    "    # 用户-离商品的距离中位值\n",
    "    md5 = md1.groupby('Merchant_id').agg('median').reset_index()\n",
    "    md5.rename(columns={'Distance': 'merchant_median_distance'}, inplace=True)\n",
    "    # 将所有特征合并在一起\n",
    "    merchant_feature = pd.merge(md2, md3, on='Merchant_id', how='left')\n",
    "    merchant_feature = pd.merge(merchant_feature, md4, on='Merchant_id', how='left')\n",
    "    merchant_feature = pd.merge(merchant_feature, md5, on='Merchant_id', how='left')\n",
    "    new_data = pd.merge(new_data,merchant_feature,on='Merchant_id',how='left')\n",
    "    return new_data\n",
    "# 调用上边函数构建距离相关的特征属性\n",
    "new_data = Get_mer_dis(new_data)\n",
    "new_test_data = Get_mer_dis(new_test_data)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:20.927804200Z",
     "start_time": "2024-09-23T13:46:20.752824Z"
    }
   },
   "id": "268d407352593896"
  },
  {
   "cell_type": "code",
   "execution_count": 594,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHDCAYAAADIo3XgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABF5UlEQVR4nO3de1xUdeL/8fdcAAFhBFG8Ul7xhpgLamqlSdaammnW2u5Wu9Uu3Qu2C3azaE28lFa6Zq5pS6Z5idbKX6a1X9O0m+WaiSiZitfkJoNyn98fLJMkIEwwM3pez8fDx6OZz8w57zkQvDnnc84xORwOhwAAAAzI7OkAAAAAnkIRAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAtCoDh8+rC+//LLRlnfq1KlGW1ZD7N+/X3a7/Vct4+TJk9q7d2+D3lNeXl7j8zt37tTWrVt/VR4AZ6MIAWhUQUFBmjNnjt54440GvW/FihWaM2eODh06VO35v/zlL3r++efrvZz4+Hjt2bOnQeuuSVlZmR5++OEGF5kzZWVl6brrrlNeXl693zN9+nQ9/PDDZz2fl5enBx54QNwMAGhcFCEATg6HQzk5OWc9n5ubqw8//FALFy5UcXHxOZfx2GOPydfXV6+99poee+wxTZw4Uf/4xz/qfN+IESO0a9cuLVy4sNrzl1xyiQ4ePFjvzxAYGKiioiJt27ZNx48flyQtX75cr776ar3ef/r0aZWUlKhLly5KSUnRjBkzXN4z9M0332jw4MFq0aKFpMptc+zYMe3atUsnT56s8T1Dhw6V2Vz9R3NOTo4KCwvVrFkzPfHEE5o6dWqd+ascPnxYu3fvVmZmptatW6fExERFRUUpISGh2usAI7N6OgAAz/rhhx+0detW5eXl6dSpU1qyZImmTZsmi8WiNWvWqKSkRL6+vurdu7cGDRokPz+/s5bxf//3f1q+fLn8/f118cUXq0OHDtq0aZNatGihxMREmUwmhYWF1ZkjNDRU8+fPV0VFRbXnbTabunbtes7PsWLFCvXv318+Pj4KCgpScnKy7rjjDrVu3VrHjx+v916Z9957T88//7wWL16svn376q677tIDDzygefPm1fjZq2RnZysvL092u13Z2dn66aeftHz5clksFt1xxx06ffq0CgsLZbVa5efnJx8fH82ZM0c2m63aciIiIhQaGup8fOTIES1YsEA2m01hYWH685//rE6dOtWaY/LkyTp06JBefvllHT58WHfddZemTJmirl276tlnn9W3336rb7/9VmVlZfXaHsCFjiIEGFyLFi20Zs0aLV26VCaTSRs3btRll12mH3/8UUFBQZo2bdo5l3HFFVeoVatWioyM1K5du7Rq1Srt2bNHb7zxhsxms6666iqtWrWqzl/gVX65N8Riscjf3/+c7+vVq5f+85//SKrcE/LCCy84S8aWLVuUkpJyzmVI0vfff6/evXurT58+kqR+/fpp4MCBuvvuuzV37lw1a9asxvcdOXJEr776qvz9/dWpUyedPHlSZWVlevHFF7V69Wrdddddat68+TnXHxQUpAMHDmj27NmKj49X27ZtNWjQIG3atEk5OTlaunSpHnjgAQUHB9f4/qlTp+q+++7T5s2bNX78eLVo0ULXXnutczwgIECTJ09WUFBQvbYHcKGjCAEGFxoaqtatW6ugoEBff/21rFarmjdvrpCQkGqvy8/P1+nTp9WmTZsal7NixQqNHDlSYWFhKi4uVrdu3fTuu+8qKipKnTp10sUXX1xnji1btujQoUO64YYbqj1vMplkMpkkVe51qaioUKtWraq9JisrS8XFxQoNDVV6errsdrv8/f310EMPqbi4WGFhYerYsaMyMzP16aef6rLLLlOXLl3OypCenq6PPvpIq1atqlbI7rjjDn366af605/+pLlz51bbY1OlT58+evnllyVVHgK7+eab9fTTT6tLly5atmyZfve7352zCGVkZKhVq1bq1KmTunbtqm+++UaXXnqphg8frm7duungwYPq06ePXnrpJX333Xey2WxKTk5W69atncvw9/fXwoULnXvWunbtKrvd7ly3r6+vLr300jpzAEZCEQKga6+9VklJSWrbtq0WL14ss9ksq9Wq48eP6/XXX9ePP/6o3bt3a+fOnXrzzTfVt2/fs5aRnZ2tZs2aaevWrbrmmmuUk5Ojw4cPa8GCBfrjH//oLDNn2rdvn9auXav09HT997//Ve/evTVy5Ejt2bNHJ06cUFZWljZs2KCTJ0/qyy+/lNVqVceOHXXXXXepZcuWzuXY7Xbt379f77zzjk6fPq3f/va3GjBggFq1aqUpU6aoZcuWio+Pl4+Pj2JjY88qeVXLSEpK0pw5cxQeHl5tzGw2KyUlRWPHjtXYsWP1xBNP6Oqrr67xM0nS0qVL1blzZw0cOFBSZdm02WzatWuXDh48qGHDhsnX17fae3Jzc/XWW2/pnnvukSRFRUXp3Xff1cqVK1VaWqrAwEANHz5cQUFBmjBhgm6++Wb5+vpW2w5VysvLtW3bNsXGxioqKkqzZ8+WyWTSf//7Xw0ePFgOh6PW7IDRUIQAaOTIkbr44os1d+5c5yEXk8kks9msMWPGKCwsTDk5OZowYYJ69epV4zJycnI0a9Ys/eY3v9HGjRuVkJCg6667Tm3bttWYMWNqfE94eLgGDRqkO++8UwsWLFDv3r1VXl6uL774Qj4+PoqOjlZxcbHMZrPi4+Nrzd+jRw+tX79et912m9auXavo6GjFx8frySefVGRkpCZNmqTrr79er7zyitq3b3/W++12ux5++GE9/vjj+s1vfiOpcq/Ojz/+qM8++0xffPGFxowZo1mzZmnevHmaPn26Vq9erSeffFIdO3astqz09HS98847OnnypKZNm6by8nLl5eVp4cKFatu2rZYuXao1a9Y49x5VSU1NVXBwsIqKiiRJF110kS6//HKFhIQoKytLJ0+e1IEDBzRz5kzdc889tW5TSfrHP/6h66+/XpI0YcIEJSQkaNy4cfroo4+UkJBACQLOQBECDC41NVWDBg1SaGioDhw4oCeeeEI33XSTwsLCnP+kyr03AwYMkNVa84+N1NRUSVJFRYWGDBkiqfJQj5+fn2bMmKGQkBD97ne/qzY5OCAgQP3795cknThxQhEREQoJCdFdd93lfM3OnTvrPFPN4XDojTfeUGxsrMLCwnTTTTepQ4cOeuutt5SRkaHRo0dLkkpLS2vce5Kdna033nhDTz31lNauXatFixbp5MmTMpvNuu6669SrVy9t3bpV9957rzZs2KDly5fXmuXw4cN6/PHH9eKLL+rhhx/WY489JknatGmTEhISJEkHDhyocZ7R7t279eCDD1Y7Q61fv34qKyvT5MmTtWTJElmtVhUUFDjPhqvJli1btG/fPmfhs1qtOnLkiH77299q8+bNlCDgFyhCgMFlZ2dr8+bNuu6669SnTx8lJydLqpx38+OPPyolJUVHjx7VqVOn1Lt377Pe/89//lPFxcXy9fVVWVmZ9u/fr4svvljbt29X27Zt1blzZ3Xo0EG33nqrTp8+rQcffLDGHAcPHlTbtm2Vk5OjoKAg+fj4OMfq+uVdWFioSZMmydfXVytWrND27du1d+9elZSUaNSoUUpOTtaUKVMUHh5eYwEJCgrSQw89JEn6wx/+oBtvvFEzZszQsWPHNGHCBElSp06ddMMNN9S4N6lK1baaMWOGIiIiVFpaWmP+4uLiGudLPfvsswoNDdXWrVurvd5qterkyZOaP3++hg4dqrZt29ZaDD/44AM99dRTWrRokfO5WbNm6e6771bz5s0VGBh41nvKy8tlsVhq/VzAhY4iBBhc586dVVBQUG1S8qlTp1RaWqqQkBDdc889dU7yLSkpUatWrTRx4kRJ0osvvqjf/e53io6O1s0336yUlBT16NFDPXv2dJ6JVdMy0tPTNW/ePPXt21dXXXVVtfHailBOTo7eeust5efny2Qy6bPPPtM111yjzZs3KyYmRmFhYRo/frz+9Kc/acSIETUu48y5OlX//fHHH+v11193Pp+dna3Y2Nhat8F3332n//73v3rhhRfk7++v/Px85yGuqvwnTpzQ/PnztXbtWsXFxZ21jKoJ2EePHq2WKT8/X61bt9aNN94ou92uFi1aKCMjo8YcS5YsUbt27ZxzuP7973/LbrdrwoQJKi4uPuvSBFLl3qorrrii1s8GXOi4oCJgcGFhYSopKdH+/fu1bds2zZo1S3v37tWpU6dks9mqlaCqCy6eeXXjM68PdPz4cb333ntas2aNXnzxRXXp0kUrVqyQVHk2U02TlCVp8eLFysvLU79+/c4qQZKq7R06U2hoqIYOHarbb79dSUlJat++veLj45Wbm6vx48dLqpw/dOjQoXqdui5J8+fP1+jRo6tdu2jnzp1nzQU6U58+fXTzzTdXO80/KirK+d9ms1lhYWEaPXq0wsPDNWDAgFqXtWvXLgUEBDgfHzp0SHl5efrggw908OBBNW/eXNnZ2TW+98knn3TOHfriiy/08ccfa/r06c6Se+zYsWqvP3r0KLftgOGxRwgwKIfDobVr12rDhg36/PPPNXr0aM2ZM8d5Wvm6det06NAhbdiwQd9//722bdum3bt3y8fHR9dcc42SkpIkqdqp2ZmZmRowYIBuueUWRUREqKyszHnLjOPHj9daRgIDAzV58uRa99rUNi9JkqKjo53//ac//UkjR45Ur169FBQUpJycHM2cOVOvvvqqEhISFBAQoHHj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CAAAGJZHilBycrIiIyOd/6666ipJUkZGhiZMmKDY2FilpKTI4XA439MUYwAAwNg8UoR27typBQsW6Msvv9SXX36pd955RyUlJYqPj1fv3r21atUqZWZmavXq1ZLUJGMAAABuL0JlZWXKyMhQTEyMgoODFRwcrObNm2vjxo2y2+1KSkpSRESEEhIStHLlSklqkjEAAACru1e4e/duORwOjRs3TseOHVNsbKySk5OVnp6u6Oho+fv7S5IiIyOVmZkpSU0y1lAmk+uf2ZX1uGt9jc1Tub15u3lrNm/NJZHNVWRzDdlc483ZpPrncnsRyszMVLdu3fTEE08oJCREf//73/XUU0+pa9eu6tChg/N1JpNJZrNZ+fn5stvtjT5ms9kalLtly6Bf8akbzt3rawwhIYGejuDV281bs3lrLolsriKba8jmGm/OVh9uL0Jjx47V2LFjnY+ffPJJxcXFqXPnzvL19a32Wj8/PxUVFclisTT6WEOLUHZ2gdwxz9pkqvymctf6amKxmF0qNbm5hSovr2iCROfmDdutNt6azVtzSWRzFdlcQzbXeHM26ed85+L2IvRLwcHBqqioUFhYmPbs2VNtrLCwUD4+PrLZbI0+1lAOh9z6hXb3+hqLpzN783bz1mzemksim6vI5hqyucabs9WH2ydLP//88/rggw+cj3fs2CGz2azIyEht377d+XxWVpZKSkpks9kUFRXV6GMAAABuL0I9e/bU7Nmz9eWXX2rLli1KTk7W9ddfryFDhqigoEBpaWmSpAULFmjw4MGyWCyKjY1t9DEAAAC3HxobN26cMjMzdffddyswMFBxcXFKSEiQ1WpVcnKyEhMTNX36dJWXlys1NbUyZBOMAQAAeGSOUGJiohITE896Pi4uTuvWrdOOHTvUv39/hYaGNukYAAAwNo9Plv6l8PBwhYeHu20MAAAYFzddBQAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhkURAgAAhmX1dABcOCyW+vXqigqHKiocTZwGAIBzowjhV2vV3E+qKFdwsH+9Xu8oL1NOXhFlCADgcRQh/GrB/lbJbJFW3SGdyKj7xWHdZZqwUGaziSIEAPA4ihAaz4kM6ch2T6cAAKDemCwNAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMiyIEAAAMy+NF6Pbbb9fq1aslSRkZGZowYYJiY2OVkpIih8PhfF1TjAEAAGPzaBH697//rU2bNkmSSkpKFB8fr969e2vVqlXKzMx0FqSmGAMAAPBYEcrLy1NKSoo6deokSdq4caPsdruSkpIUERGhhIQErVy5ssnGAAAArJ5acUpKiuLi4lRcXCxJSk9PV3R0tPz9/SVJkZGRyszMbLKxhjKZXPygLq7HXevzpMb8jN683bw1m7fmksjmKrK5hmyu8eZsUv1zeaQIbd26VVu2bNF7772n5557TpJkt9vVoUMH52tMJpPMZrPy8/ObZMxmszUoc8uWQa5+XJe4e33uFhIS2CTL9ebt5q3ZvDWXRDZXkc01ZHONN2erD7cXoeLiYj399NOaMmWKmjdv7nzeYrHI19e32mv9/PxUVFTUJGMNLULZ2QVyxzxrk6nym8pd66uJxWJusqJSJTe3UOXlFY22PG/YbrXx1mzemksim6vI5hqyucabs0k/5zsXtxehefPmqU+fPho2bFi15202m/bs2VPtucLCQvn4+DTJWEM5HHLrF9rd6/OEpvh83rzdvDWbt+aSyOYqsrmGbK7x5mz14fYitGbNGuXm5iomJkaSVFRUpLVr16p9+/YqKytzvi4rK0slJSWy2WyKioqqNsm5McYAAADcftbY0qVLtWbNGqWlpSktLU1XXnml7r//fqWmpqqgoEBpaWmSpAULFmjw4MGyWCyKjY1t9DEAAAC37xFq06ZNtccBAQEKCQlRaGiokpOTlZiYqOnTp6u8vFypqamVIa3WRh8DAADw2OnzVaZNm+b877i4OK1bt047duxQ//79FRoa2qRjAADA2DxehH4pPDxc4eHhbhsDAADG5fF7jQEAAHgKRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABgWRQgAABhWoxah4uJiffzxx425SAAAgCbT4CJUUlKiadOm1Tj2zjvv6NChQ786FAAAgDs0uAj5+vrqhx9+UGlpabXnjx07phdffFFdu3ZttHAAAABNyVrfF86dO1eBgYG64YYbdMkllygxMVGnT59Whw4dFBMTozfffFMpKSm69NJLmzIvAABAo6l3Eerfv7+ysrL05JNPqrS0VJMnT1a7du30n//8R2+++aYuueQSDRs2rAmjAgAANK56F6GBAwdq0KBBmjhxorKysrR69WoNGjRIhYWFeu211/TVV1/pq6++UkxMTFPmBQAAaDT1LkL//ve/lZOTozZt2mjEiBGy2Wzq06eP/Pz8VFpaqpiYGH3//fc6deqUAgICmjIzAABAo6hXEcrPz9fll1+ugwcP6uDBg9qwYYNatmwpk8mkuXPnytfXV926ddP//d//ae7cuRQhAABwXqhXEVq0aJGys7NltVpVXFysTz/9VKNHj5a/v7/Ky8v1+OOPa+7cuerUqZPCw8ObOjMAAECjqFcReuihhyRVnjl2xRVXKDc3V0FBQerRo4fGjh2rv//977r66quVl5en//73v+rbt2+ThgYAAGgM9Z4jJEnXXXedOnTooH79+mnEiBH6/PPPNWrUKB07dkzXXnutKioq9M4771CEAADAeaFBRahDhw6SpFtvvVX+/v4ym83y9fXV3r17JUlms1lDhw5t/JQAAABNwKV7jfn7+0uSunTpIkm64447nGPMEQIAAOcLl4rQtm3bqj3mthoAAOB85FIRWrp0aWPnAAAAcDuXilBjXCcoNzdX27ZtU05Ozq9eFgAAgCvqNVn67bff1q5du3TRRRfJ19dXx44d0+LFi+Xn5yeTySSz2SyLxSJfX1+FhoZq4MCBslprX/T777+vKVOmqH379tq3b5+mTp2qa6+9VhkZGUpKStKBAwd0ww036JFHHpHJZJKkJhkDAADGVq89QllZWerZs6dat26t0NBQ9ejRQ3a7XaGhoQoJCZHNZlPz5s2dxaguJ0+eVHJyst58802lpaXpmWee0cyZM1VSUqL4+Hj17t1bq1at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Ro3ydAynkpISxcfHq3fv3lq1apUyMzO95q85b9tWVTIzM/XQQw9p1KhRCgsL06RJk/Tdd995OpakyiurT548Wd27d5ck9ejRQ/n5+R5OVV1eXp5SUlLUqVMnT0dxKisrU0ZGhmJiYhQcHKzg4GA1b97c07GcHA6HnnrqKd16662KiIjwdBwnX19f5/YKDg5WWlqaRo4cqY4dO3o6mr7//ntFR0erd+/eateuncaPH699+/Z5OpbS0tI0ceJEDRkyRO3bt9cjjzyir7/+Wrm5uR7LlJOTo/j4eB06dMj5nDf/bmgIipAXSk5O1q233urpGE4bN26U3W5XUlKSIiIilJCQoJUrV3o6liTv21ZVhg8frkmTJjkf79u3TxdddJEHE/2sbdu2Gjt2rCSptLRUixYt0siRIz2cqrqUlBTFxcWpX79+no7itHv3bjkcDo0bN059+/bV7bffrsOHD3s6ltPbb7+t9PR0dejQQZ988olKS0s9HeksxcXFeuONN/SXv/zF01EkSV27dtXWrVv1/fffq6CgQEuXLtWQIUM8HUu5ublq166d87H5f7dlt1qtnopU4x+d3vy7oSEoQh5y9913KyYm5qx/qampXvGX0pnS09MVHR0tf39/SVJkZKTXzHfxtm1Vk5KSEi1atEg333yzp6NUk56eriFDhmjz5s2aPHmyp+M4bd26VVu2bNHDDz/s6SjVZGZmqlu3bpo1a5bef/99+fj46KmnnvJ0LEmVe/lmz56tiy66SEePHtXrr7+uP/zhDyouLvZ0tGrWrFmj6OhodejQwdNRJFUWoauvvlrXX3+9YmJitH37dj366KOejqWePXtqw4YNcvzv6jarV69W3759FRQU5LFMNf3R6c2/GxrCc/XS4J599lkVFRWd9XyLFi3cH+Yc7HZ7tR9cJpNJZrNZ+fn53LOtHmbPnq2AgADdeOONno5STWRkpBYvXqyUlBQlJSVp7ty5no6k4uJiPf3005oyZYpXHXaSpLFjxzr3pEnSk08+qbi4ONntdo9n/eijj3T69GktWbJELVq00F//+leNGTNGaWlpuummmzya7UzLli3Tfffd5+kYTt9++60++eQTrVixQl26dNGCBQt05513auXKlTKZTB7L9ec//1nx8fEaP368/Pz89M033yglJcVjeaSa/+i8UH43UIQ8JCwszNMR6s1iscjX17fac35+fioqKjqvvtk9YfPmzVq2bJnefvtt+fj4eDpONSaTSb169dK0adM0fPhwr/jhNW/ePPXp00fDhg3zaI76CA4OVkVFhY4fP+7xInT06FH17dvX+YeU1WpVZGSk15wBJUn79+/XgQMHNHjwYE9Hcfrggw907bXXqm/fvpKkBx98UMuWLVN6erp69uzpsVwtWrTQsmXLtH//fv3zn/9Ufn6+xowZ47E8tblQfjdwaAznZLPZzjp1s7Cw0Ot+sXubgwcP6m9/+5umTJmirl27ejqO05YtW6r9dVl1A+KqeQietGbNGn388cfOQ8XvvfeennnmGU2ZMsXT0fT888/rgw8+cD7esWOHzGaz2rZt68FUldq0aXPWYbDDhw9Xm2fiaWvXrtWwYcO86udGeXm5Tpw44XxcWFioU6dOqby83IOpfta6dWt99NFHSkxM9MobhV8ovxvYI4RzioqKqjYBLisrSyUlJedV43e3oqIi/fWvf1VcXJxGjBihwsJCSVJAQIBHd7lLUufOnXXPPffo4osv1uWXX67Zs2dryJAhHp1/UGXp0qUqKytzPp4+fbqio6N1/fXXezBVpZ49e2r27Nlq1aqVysrKlJycrOuvv945P8KThg0bpueee05vvfWWhg8frnXr1mnXrl164YUXPB3N6dNPP9X48eM9HaOa/v37a/LkyVq8eLFatmypFStWKCwsTJGRkZ6OJkn617/+pc6dOysuLs7TUWp0ofxuoAjhnGJjY1VQUKC0tDSNGzdOCxYs0ODBg73yLxRvsWnTJmVmZiozM1Nvv/228/kNGzZ4fKJoeHi45syZo+eff14pKSkaOnSoZsyY4dFMVdq0aVPtcUBAgEJCQrziRsnjxo1TZmam7r77bgUGBiouLk4JCQmejiWp8lDKwoULNW3aNE2bNk1hYWF68cUXPf69VqWoqEjbt2/Xs88+6+ko1YwaNUr79u3TkiVL9NNPP6lbt256+eWXvWKPxsmTJ/XPf/5Tr732mqej1OpC+d3ATVdRL+vXr1diYqICAwNVXl6u1NRUdevWzdOxAABuFBkZWe0PugvhdwNFCPV27Ngx7dixQ/379/eKv9ABAJ53vv9uoAgBAADD8vxpIgAAAB5CEQIAAIZFEQIAAIZFEQIAAIZFEQKAMxQXF+vUqVOejgHATShCAHCGwsJC3XLLLUpPT/d0FABuwOnzAC5IJ0+eVFZWlnr16iWp8r5Su3bt0pdffqmWLVtWu5O8VHkn7by8POXl5emHH37QgQMHVFhYqNzcXPXo0UO33XabBz4FgKbGLTYAXFBeeuklBQQEqEWLFpo2bZree+89JSYmqkePHurcubN+85vfOMtRFYfDoTVr1qi0tFTNmzdX586dtWjRIr366qvavn27LrvsMg99GgBNjSIE4ILSqlUrdevWTTExMfr222/Vpk0btWnTRo888oj8/PxqfI/JZNKgQYO0fft2/fa3v9Uf//hHBQUFyWazaeHChQoNDVVMTIybPwkAd6AIAbigjBw5Us8995zef/99DR8+XJLk7++vH3/8UV9//bU2bNig9u3b13gD0OPHj+urr77S008/rR07dmjdunUKCAigBAEXMCZLA7igtGzZUs8884x++uknjRgxQpJkNpu1f/9+jRw5UvHx8SopKTnrffv371daWpree+89zZw5U506dVJERITuueced38EAG5EEQJwwSgoKNC8efMUHBys/Px8vfzyyyosLFRFRYWuuOIK2Ww2bd++Xf379z/rvcOGDdMHH3ygZ555RgcPHlR5ebl+/PFHbdy4UU8//bSysrI88IkANDUOjQG4YAQFBemrr76SJPXq1Uv33XefJKmiokKvvPKKKioq1LZtW0VHRzvfU1FRobvvvltXXnmlTCaT9uzZo5EjR8rX11eXXnqpxo0bp1tuuUVbtmzRxIkTPfK5ADQdihCAC0q7du0kVZ4O///+3//TJZdcopKSEt177701TpY2m80KDAzUhAkTZLFY9Nxzz2nkyJHauXOnpk6dqtWrV6tjx47q3Lmzuz8KADegCAG4YGRmZurw4cN68sknFRERoQEDBig0NFQ5OTnKycnR4cOH9c033+j7779XeXm5nnvuOQUFBam0tFQOh0MnT57Uxx9/rE6dOmnMmDFq2bKlJKmoqEhBQUEe/nQAmgJFCMAFoaSkRKmpqZo4caJGjhwpi8XiHLNYLHr55Zc1YMAADRgwQGPGjFHz5s0VGBgoSbJarbJarQoODtZHH33kfO/ll1+uLVu2aNu2bc5SBODCwpWlARhednZ2rUVn6tSpysjI0OLFi90bCoBbUIQAoA52u10+Pj61XowRwPmNIgQAAAyL6wgBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADDoggBAADD+v/yaUtRp7pNFgAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 距离柱状图\n",
    "x = np.arange(-1,11)\n",
    "dis1 = np.array(new_data['Distance'].value_counts().sort_index())\n",
    "dis2 = np.array(new_test_data['Distance'].value_counts().sort_index())\n",
    "plt.bar(x,dis1,tick_label=x, label='off_train', width=0.3)\n",
    "plt.bar(x+0.3,dis2,label='off_test',width=0.3)\n",
    "plt.xlabel('距离')\n",
    "plt.ylabel('计数')\n",
    "plt.title('距离计数分布情况')\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.116329400Z",
     "start_time": "2024-09-23T13:46:20.931799700Z"
    }
   },
   "id": "c8c0fd0d7950f880"
  },
  {
   "cell_type": "code",
   "execution_count": 595,
   "outputs": [],
   "source": [
    "# 定义变换距离类型的函数\n",
    "def get_distance_type(row):\n",
    "    # 距离未知\n",
    "    if row == -1:\n",
    "        return -1\n",
    "    # 1千米内\n",
    "    elif row >= 0 and row <= 2:\n",
    "        return 0\n",
    "    # 1.5-2.5千米内\n",
    "    elif row >= 3 and row <= 5:\n",
    "        return 1\n",
    "    # 3-4.5千米内\n",
    "    elif row >= 6 and row <= 9:\n",
    "        return 2\n",
    "    # 5千米\n",
    "    elif row == 10:\n",
    "        return 3\n",
    "    # 构建距离类型的特征属性\n",
    "new_data['Distance_type'] = new_data['Distance'].apply(get_distance_type)\n",
    "new_test_data['Distance_type'] = new_test_data['Distance'].apply(get_distance_type)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.194020300Z",
     "start_time": "2024-09-23T13:46:21.118318600Z"
    }
   },
   "id": "1112c19d3526a714"
  },
  {
   "cell_type": "code",
   "execution_count": 596,
   "outputs": [
    {
     "data": {
      "text/plain": " 0    71864\n 1    12917\n-1    12064\n 3    10353\n 2     6442\nName: Distance_type, dtype: int64"
     },
     "execution_count": 596,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 新距离类型分布情况\n",
    "new_data['Distance_type'].value_counts()\n",
    "new_test_data['Distance_type'].value_counts()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.209277900Z",
     "start_time": "2024-09-23T13:46:21.196240300Z"
    }
   },
   "id": "df41e4f885836da8"
  },
  {
   "cell_type": "code",
   "execution_count": 597,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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RxsRERFJW72vGgsNDX3glX///fc4ePAgAECn0yE8PBz+/v6Ij4+HWq02BiRztBERERHVKwiZQl5eHmJiYtC2bVsAQFJSEjQaDaKiouDj44OIiAhs3brVbG1EREREVhvUExMTg0GDBqG4uBgAkJqaisDAQNjb2wMA/Pz8oFarzdZWV2K6YXZFLWKqiRqWxvTd4f4gDuwHcWA/3FXbbWCVIPTbb7/h8OHD2LFjBz744AMA5QOuvby8jPNUPMMsPz/fLG0qlapONbu5OdX3xzUbMdZE4ufi4mDtEsyC+4M4sB/Egf1QexYPQsXFxXj//fcxZ84cODo6GqdXPLT172xtbVFUVGSWtroGoezsAohlnLUglH/JxVRTQyWXyxptMKhJbq4Wen3jue8X9wdxYD+IA/vhroptcT8WD0Kff/45unbtin79+lWarlKpcO7cuUrTtFotbGxszNJWVwYDRPelEmNN1DA0xu8N9wdxYD+IA/uh9iwehLZv347c3FwEBwcDAIqKirB79260atWq0qM60tPTodPpoFKpEBAQUGmQsynaiIiIiCx+1djGjRuxfft2JCYmIjExEQMGDMDUqVMRFxeHgoICJCYmAgBiY2MRGhoKuVyOkJAQk7cRERERWfyIUIsWLSq9b9KkCVxcXODq6oro6GhERkZi4cKF0Ov1iIuLKy9SoTB5GxEREZHVn4mxYMEC478HDRqEPXv2ICUlBUFBQXB1dTVrGxEREUmb1YPQP3l4eMDDw8NibURERCRdVruzNBEREZG1MQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZFktCOXm5uL48ePIycmxVglEREQkcVYJQjt37sSQIUMwb9489O/fHzt37gQApKWlISwsDCEhIYiJiYHBYDAuY442IiIikjaLB6Hbt28jOjoaGzZsQGJiIubOnYvFixdDp9MhPDwc/v7+iI+Ph1qtRkJCAgCYpY2IiIjI4kFIq9VixowZ6NixIwCgU6dOyM/PR1JSEjQaDaKiouDj44OIiAhs3boVAMzSRkRERKSw9Ao9PT0xatQoAEBJSQlWr16NIUOGIDU1FYGBgbC3twcA+Pn5Qa1WA4BZ2upKEOr5A5tBRS1iqokalsb03eH+IA7sB3FgP9xV221g8SBUITU1FRMmTICNjQ12796Nzz//HF5eXsZ2QRAgk8mQn58PjUZj8jaVSlWnet3cnB7gpzUPMdZE4ufi4mDtEsyC+4M4sB/Egf1Qe1YLQn5+fli7di1iYmIQFRWFNm3aQKlUVprH1tYWRUVFkMvlJm+raxDKzi6AWMZZC0L5l1xMNTVUcrms0QaDmuTmaqHXl1m7DJPh/iAO7AdxYD/cVbEt7sdqQUgQBHTp0gULFixA//79ERERgXPnzlWaR6vVwsbGBiqVyuRtdWUwQHRfKjHWRA1DY/zecH8QB/aDOLAfas/ig6UPHz6MmJgY43u5XA4A8PX1RXJysnF6eno6dDodVCoVAgICTN5GREREZPEg5Ovri82bN2Pz5s24ceMGlixZgkceeQT9+vVDQUEBEhMTAQCxsbEIDQ2FXC5HSEiIyduIiIiIBIMV7jB44MABfPTRR7h58yb69OmDOXPmwNXVFXv37kVkZCQcHByg1+sRFxeHDh06AIBZ2uoiK0s851sFAXB3dxJVTQ2VQlE+Rmj4Jwdw6vpti613VKAnPhkXBKx8FLiRfP8FTMEzEJiUhNxcLUpLG9cYIe4P1sd+EAf2w10V2+J+rDJGqG/fvujbt2+V6YMGDcKePXuQkpKCoKAguLq6mrWNiIiIpM1qg6Vr4uHhAQ8PD4u1ERERkXTx6fNEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZDEJEREQkWQxCREREJFkMQkRERCRZVglCe/fuxcCBA9GlSxeMGTMGarUaAJCWloawsDCEhIQgJiYGBoPBuIw52oiIiEjaLB6Erly5ghkzZiAyMhJJSUlo2bIlZs6cCZ1Oh/DwcPj7+yM+Ph5qtRoJCQkAYJY2IiIiIosHIbVajTfffBPDhg2Du7s7xo0bh5MnTyIpKQkajQZRUVHw8fFBREQEtm7dCgBmaasrQRDXS4w1NcSXVFl7u5ujH61dA1/sB7G82A+Vt8X9KEz/K/be+vfvX+n9xYsX0bp1a6SmpiIwMBD29vYAAD8/P+MpM3O01ZWbm1O9ljMnMdZE4ufi4mDtEsyC+4M4sB/Egf1QexYPQn+n0+mwevVqTJw4EVevXoWXl5exTRAEyGQy5OfnQ6PRmLxNpVLVqdbs7AKIZXiRIJR/ycVUU0Mll8sabTCoSW6uFnp9mbXLMBnuD+LAfhAH9sNdFdvifqwahJYtW4YmTZpg7NixWLZsGZRKZaV2W1tbFBUVQS6Xm7ytrkHIYIDovlRirIkahsb4veH+IA7sB3FgP9Se1S6fP3ToEDZt2oQlS5bAxsYGKpUKOTk5lebRarVmayMiIiKyShC6evUq3nrrLcyZMwft27cHAAQEBCA5Odk4T3p6OnQ6HVQqlVnaiIiIiCwehIqKijBp0iQMGjQIAwcOhFarhVarRXBwMAoKCpCYmAgAiI2NRWhoKORyOUJCQkzeRkRERGTxMUIHDx6EWq2GWq3Gt99+a5y+b98+REdHIzIyEgsXLoRer0dcXFx5kQqFyduIiIiILB6EBg0ahLNnz1bb5uXlhT179iAlJQVBQUFwdXWttJyp24iIiEjarHrVWHU8PDzg4eFhsTYiIiKSLj50lYiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCRLYe0CpEwmEyCTCfVeXi6vX44tKzOgrMxQ7/USERE1FgxCViKTCVA1bQJFPcMMALi4ONRruVJ9GfLzChmGiIhI8hiErEQmE6CQy/DGpj9xPlNjsfW2b+6I5c/1gEwmMAgREYkUzxhYDoOQlZ3P1ODU9dvWLoOIiESCZwwsi0GIiCTtQf/yrg8p/tVNtcczBpbFIEREkiWTCXBtagdBbtlfhQZ9KXLyiiT1nw3VHc8YWAaDEBFJlkwmlIeg+H8BWWmWWal7RwhhqyT3VzeRWDEIERFlpQE3kq1dBRFZAYOQRNX3ioL64pgIIiISIwYhiWnmaAuU6eHsbG/R9XJMBBERiRGDkMQ42ysAmZxjIoiIiMAgJF0cE0EiY40byFn6FDERiQ+DEBFZnTVvIEdE0ma1IJSbm4uwsDCsX78eXl5eAIC0tDRERUXhypUrGD16NN555x0IgmC2NiISB2vdQK6fXzO8/Xgni62PiMTHKseFc3JyEB4ejmvXrhmn6XQ6hIeHw9/fH/Hx8VCr1UhISDBbGxGJT8UN5Cz1uppTaO0fmYiszCpBKCIiAsOGDas0LSkpCRqNBlFRUfDx8UFERAS2bt1qtjYiIiKqSi6XQaGw3MvSj7j5J6ucGouOjoa3tzfmz59vnJaamorAwEDY25df1u3n5we1Wm22trri2TTT4HYUB/aDODSmfqj4WRrTzyQ11ry9Sm6+6W+vUtvvolWCkLe3d5VpGo3GOFYIAARBgEwmQ35+vlnaVCpVnWp2c3Oq0/xUFQezigP7QRwaaz/wd2XDZc3bq7i6OlpmfdUQzVVjcrkcSqWy0jRbW1sUFRWZpa2uQSg7uwAGE4ZVuVzWaH8R1iQ3Vwu9vszaZVTCfhAH9kPDJwjlIcjUvyulyOr7gxVur2KO/aHiO3k/oglCKpUK586dqzRNq9XCxsbGLG11ZTCAO7cJcBuKA/tBHBpjP/B3JdWXtb43ormbWEBAAJKT7ybQ9PR06HQ6qFQqs7QRERERiSYIhYSEoKCgAImJiQCA2NhYhIaGQi6Xm6WNiIiISDSnxhQKBaKjoxEZGYmFCxdCr9cjLi7ObG1EREREVg1CZ8+erfR+0KBB2LNnD1JSUhAUFARXV1ezthEREZG0ieaIUAUPDw94eHhYrI2IiIikSzRjhIiIiIgsjUGIiIiIJItBiIiIiCSLQYiIiIgki0GIiIiIJItBiIiIiCRLdJfPExGR9MhkAmQywaLrLCszoKyMD0aTOgYhIiIyetBAIpfX/USDIAhQOdlCsPDjjwz6UuTkFTEMSRyDEBERASgPQaqmTaCoR5ip4OLiUP8C4v8FZKXVf/m6cO8IIWwVZDKBQUjiGISIiAhAeRBSyGV4Y9OfOJ+psdh6+/k1w9uPdyoPQTeSLbZeIoBBiIiI/uF8pganrt+22PraNXuAo0hED4hXjREREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkSSIIpaWlISwsDCEhIYiJiYHBYLB2SURERCQCjT4I6XQ6hIeHw9/fH/Hx8VCr1UhISLB2WURERCQCjT4IJSUlQaPRICoqCj4+PoiIiMDWrVutXRYRERGJgMLaBZhbamoqAgMDYW9vDwDw8/ODWq2u8+fIZIA5zqj5t3SGvVJu+g+uQbtmjuX/aNENsGlimZW6tTf+UybS6M1+EAf2gziwH8SB/fBgBKGW8xka+YCZBQsWoLi4GO+//75xWq9evfDDDz9ApVJZsTIiIiKyNpHmYNORy+VQKpWVptna2qKoqMhKFREREZFYNPogpFKpkJOTU2maVquFjY2NlSoiIiIisWj0QSggIADJycnG9+np6dDpdDwtRkRERI0/CIWEhKCgoACJiYkAgNjYWISGhkIut9wANCIiIhKnRj9YGgD27t2LyMhIODg4QK/XIy4uDh06dLB2WURERGRlkghCAJCRkYGUlBQEBQXB1dXV2uUQERGRCEgmCBERERH9U6MfI0RERERUEwYhIiKiRiI3NxfHjx+vctsYqhmDUAOWm5uLAQMGID093dqlEFkN9wPr27t3LwYOHIguXbpgzJgx9XqMET24nTt3YsiQIZg3bx769++PnTt3WrukBoFBqIHKyclBeHg4rl27Zu1SJCktLQ1hYWEICQlBTEwMONTOOrgfWN+VK1cwY8YMREZGIikpCS1btsTMmTOtXZbk3L59G9HR0diwYQMSExMxd+5cLF682NplNQgMQg1UREQEhg0bZu0yJEmn0yE8PBz+/v6Ij4+HWq1GQkKCtcuSJO4H1qdWq/Hmm29i2LBhcHd3x7hx43Dy5ElrlyU5Wq0WM2bMQMeOHQEAnTp1Qn5+vpWrahgYhBqo6OhovPjii9YuQ5KSkpKg0WgQFRUFHx8fREREYOvWrdYuS5K4H1hf//79MW7cOOP7ixcvonXr1lasSJo8PT0xatQoAEBJSQlWr16NIUOGWLmqhkFh7QKoZpMnT8bvv/9eZfq0adPwf//3f1aoiAAgNTUVgYGBsLe3BwD4+flxTISVeHt7W7sE+hudTofVq1dj4sSJ1i5FslJTUzFhwgTY2Nhg9+7d1i6nQWAQErF58+ahqKioyvSmTZtavhgy0mg08PLyMr4XBAEymQz5+fl8hh1J2rJly9CkSROMHTvW2qVIlp+fH9auXYuYmBhERUVhxYoV1i5J9BiERMzd3d3aJVA15HI5lEplpWm2trYoKipiECLJOnToEDZt2oRvv/0WNjY21i5HsgRBQJcuXbBgwQL079+ff6DVAscIEdWRSqWqco8OrVbLX/4kWVevXsVbb72FOXPmoH379tYuR5IOHz6MmJgY4/uKB4vLZPxv/n64hYjqKCAgAMnJycb36enp0Ol0/KuLJKmoqAiTJk3CoEGDMHDgQGi1Wmi1Wt5SwsJ8fX2xefNmbN68GTdu3MCSJUvwyCOPwMnJydqliR6DEFEdhYSEoKCgAImJiQCA2NhYhIaGGv8CI5KSgwcPQq1W49tvv0VQUJDxxXs7WZaHhweWL1+OdevWYfjw4bhz5w4WLVpk7bIaBD50lage9u7di8jISDg4OECv1yMuLg4dOnSwdllERFRHDEJE9ZSRkYGUlBQEBQXB1dXV2uUQEVE9MAgRERGRZHGMEBEREUkWgxARERFJFoMQERERSRaDEBEREUkWgxARNUrFxcUoLCys17LVPeOPiBonBiEiapS0Wi0mTJiA1NTUOi/75ptv4siRI8jIyMCtW7dqvdw/L8IdP348jh8/Xuf1E5Hl8KGrRCRqt2/fRnp6Orp06QIA0Ov1OHPmDI4ePQo3NzeMGjWq0vwajQZ5eXnIy8vDhAkTsHfvXmzbtg25ubno1KkTJk6cWOO61Go1mjVrhvbt26N58+b48ssvkZ2djU8++aTa+bOysnDgwAH8+eefOHnyJFq3bo25c+fiyJEj6N+/P/z8/PioCSKRYxAiIlH65JNP0KRJEzRt2hQLFizAjh07EBkZiU6dOsHX1xcPPfSQMRxVMBgM2L59O0pKSuDo6AhfX1+sXr0aK1euRHJyMvr27XvPdcpkMnz99dewtbXF1atX0bp1a4wfP77G+Zs0aYIff/wRr776KlxdXTFgwAA4Ozvj66+/RmhoKBwdHaFUKk2yPYjIPBiEiEiUmjVrhg4dOiA4OBgnTpxAixYt0KJFC7zzzjuwtbWtdhlBENCrVy8kJyfjiSeewPjx4+Hk5ASVSoVVq1bB1dUVwcHB1S6bmpqKbdu2QaPRYOfOnXj55Zfh5uaGK1euwNfXt9pl5HI53NzccPDgQfzxxx+4cuUKvL294ezsDAcHByiVSpSUlJhsmxCR6TEIEZEoDRkyBB988AF27tyJ/v37AwDs7e1x6dIl/PHHH9i3bx9atWqFefPmVVk2MzMTx44dw/vvv4+UlBTs2bMHTZo0qTEEAUCnTp3QsWNHTJ8+HT179oStrS0uXbqEfv36Vfv5S5cuhSAIUKvVGDt2LARBwOOPP44OHTrgs88+A1B+hKq4uNg0G4SIzIKDpYlIlNzc3DB37lzcunULAwcOBFB+6ury5csYMmQIwsPDodPpqix3+fJlJCYmYseOHVi8eDHatm0LHx8fvPbaa/dcX0lJCZYsWYKJEyfC3d0dL730Enr37o233367yrzNmzfHggUL8OGHH8Lb2xsBAQHIzs6Gg4MDAGDKlCnIyspCeno6gxCRyDEIEZHoFBQU4PPPP4ezszPy8/Px6aefQqvVoqysDI899hhUKhWSk5MRFBRUZdl+/fph165dmDt3Lq5evQq9Xo9Lly4hKSkJ77//PtLT06td56+//oqXXnoJnTt3xq+//gqFQoF+/fph3bp1uHXrFvLy8qoss3btWrz44osAAA8PD5w8eRJXr14FUD7I+6effkK7du1Mt2GIyOT40FUiEqWXX34Zq1evxkcffYSoqCgAwIwZM+Dm5oaysjJ4enoiJCQEfn5+AICysjJMnjwZAwYMgCAIOHfuHBQKBQYMGABvb294eHhgwoQJGDlyJMaMGWNcT8X9hu7cuYOMjAzcuHED8+bNQ8uWLaHRaFBQUICSkhLY2dlh3bp1xmBz4cIF2NjYwNvb2/hZn332Gezt7TFu3DjIZDJkZ2ejVatWFtxqRFRXHCNERKLUsmVLAOWXw//3v/9Fjx49oNPpMGXKlGoHS8tkMjg4OCAsLAxyuRwffPABhgwZglOnTmH+/PlISEiAt7d3lYHPWVlZ+M9//gNBEODr6wtbW1u4ubnh3//+N4YOHVpjfX//nI0bN+LSpUs4efIkZDIZTp8+jd69e2P06NEm2hpEZC4MQkQkOmq1GtevX8esWbPg4+ODnj17wtXVFTk5OcjJycH169fx559/4vTp09Dr9fjggw/g5OSEkpISGAwG42mptm3bYuTIkXBzcwNQfsdoJyenSutq1aoVpk+fbny/dOlSvP3227h8+TIOHDhw30vuAeCpp54CAGzbtg0tWrQwDu4mIvFjECIiUdHpdIiLi8OYMWMwZMgQyOVyY5tcLsenn36Knj17omfPnhg5ciQcHR2Ng5QVCgUUCgWcnZ3x448/Gpd99NFHcfjwYRw/ftwYiqrzww8/ICsrC/369YPBYMCrr76KU6dOYeLEibCzs6syf35+PvLy8nD9+nWkp6fj559/hk6nw9atW6HVapGfnw9XV1fExMTA3d3dxFuKiEyBY4SIqNHIzs6uMejMnz8faWlpWLt2bZW29PR0JCUlQaVSYdiwYRAEAQCQm5uLqVOn4vz583jqqafwzDPPoEOHDgDK73C9Zs0aZGdnw9fXF61atUKzZs3g7u4OFxcX42frdDooFArIZLw2hUiMGISISBI0Gg1sbGxqvBkjEUkTgxARERFJFo/VEhERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFkMQgRERGRZDEIERERkWQxCBEREZFk/X8xBLhtc8xA6wAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 距离柱状图\n",
    "x1 = np.arange(-1,4)\n",
    "dis_type1 = np.array(new_data['Distance_type'].value_counts().sort_index())\n",
    "dis_type2 = np.array(new_test_data['Distance_type'].value_counts().sort_index())\n",
    "plt.bar(x1,dis_type1,tick_label=x1, label='off_train', width=0.3)\n",
    "plt.bar(x1+0.3,dis_type2,label='off_test',width=0.3)\n",
    "plt.xlabel('距离类型')\n",
    "plt.ylabel('计数')\n",
    "plt.title('距离类型计数分布情况')\n",
    "plt.legend()\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.398205200Z",
     "start_time": "2024-09-23T13:46:21.210264900Z"
    }
   },
   "id": "57fa64fb538fc640"
  },
  {
   "cell_type": "code",
   "execution_count": 598,
   "outputs": [
    {
     "data": {
      "text/plain": "User_id                     0\nMerchant_id                 0\nCoupon_id                   0\nDiscount_rate               0\nDistance                    0\nDate_received               0\nDis_rate                    0\nDiscount_type               0\nDiscount_man                0\nDiscount_jian               0\nWeekday                     0\nIs_weekend                  0\nweekday1                    0\nweekday2                    0\nweekday3                    0\nweekday4                    0\nweekday5                    0\nweekday6                    0\nweekday7                    0\nrec_coupon                  0\nCoupon_popu                 0\nMerchant_popu               0\nmerchant_min_distance       0\nmerchant_max_distance       0\nmerchant_mean_distance      0\nmerchant_median_distance    0\nDistance_type               0\nDistance-1                  0\nDistance0                   0\nDistance1                   0\nDistance2                   0\nDistance3                   0\nDistance4                   0\nDistance5                   0\nDistance6                   0\nDistance7                   0\nDistance8                   0\nDistance9                   0\nDistance10                  0\ndtype: int64"
     },
     "execution_count": 598,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 跟距离相关的独热编码\n",
    "def Get_dis_hot(df):\n",
    "    discols = ['Distance' + str(i) for i in range(-1,11)]\n",
    "    tmpdf = pd.get_dummies(df['Distance'].replace('null', np.nan))\n",
    "    tmpdf.columns = discols\n",
    "    df[discols] = tmpdf\n",
    "    return df\n",
    "new_data = Get_dis_hot(new_data)\n",
    "new_test_data = Get_dis_hot(new_test_data)\n",
    "# 集成新的数据集后，对缺失值处理\n",
    "new_data = new_data.fillna(-1)\n",
    "new_test_data = new_test_data.fillna(-1)\n",
    "new_data.isnull().sum()\n",
    "new_test_data.isnull().sum()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.636007100Z",
     "start_time": "2024-09-23T13:46:21.399202200Z"
    }
   },
   "id": "197c1faa65b405e9"
  },
  {
   "cell_type": "code",
   "execution_count": 599,
   "outputs": [
    {
     "data": {
      "text/plain": "Index(['User_id', 'Merchant_id', 'Coupon_id', 'Discount_rate', 'Distance',\n       'Date_received', 'Dis_rate', 'Discount_type', 'Discount_man',\n       'Discount_jian', 'Weekday', 'Is_weekend', 'weekday1', 'weekday2',\n       'weekday3', 'weekday4', 'weekday5', 'weekday6', 'weekday7',\n       'rec_coupon', 'Coupon_popu', 'Merchant_popu', 'merchant_min_distance',\n       'merchant_max_distance', 'merchant_mean_distance',\n       'merchant_median_distance', 'Distance_type', 'Distance-1', 'Distance0',\n       'Distance1', 'Distance2', 'Distance3', 'Distance4', 'Distance5',\n       'Distance6', 'Distance7', 'Distance8', 'Distance9', 'Distance10'],\n      dtype='object')"
     },
     "execution_count": 599,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看属性特征\n",
    "new_data.columns\n",
    "new_test_data.columns"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.664014400Z",
     "start_time": "2024-09-23T13:46:21.637012900Z"
    }
   },
   "id": "8b160e67a4e6efd3"
  },
  {
   "cell_type": "code",
   "execution_count": 600,
   "outputs": [],
   "source": [
    "features = ['Dis_rate','Discount_type','Discount_man', 'Discount_jian',\n",
    "            'Distance','Distance_type','Distance-1', 'Distance0',\n",
    "            'Distance1', 'Distance2', 'Distance3', 'Distance4', 'Distance5',\n",
    "            'Distance6', 'Distance7', 'Distance8', 'Distance9', 'Distance10',\n",
    "            'rec_coupon','Coupon_popu','Merchant_popu','merchant_min_distance',\n",
    "            'merchant_max_distance','merchant_mean_distance','merchant_median_distance',\n",
    "            'Is_weekend','Weekday','weekday1','weekday2','weekday3','weekday4',\n",
    "            'weekday5','weekday6','weekday7']"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.666023100Z",
     "start_time": "2024-09-23T13:46:21.653105100Z"
    }
   },
   "id": "b9b286334f00d40c"
  },
  {
   "cell_type": "code",
   "execution_count": 601,
   "outputs": [],
   "source": [
    "# 提取指定特征属性的数据集，并且划分为训练集和验证集\n",
    "X = new_data[features]\n",
    "y = new_data['label']\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:21.760023200Z",
     "start_time": "2024-09-23T13:46:21.668006500Z"
    }
   },
   "id": "66db9363159c06f5"
  },
  {
   "cell_type": "code",
   "execution_count": 602,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "auc 0.8925564778697379\n"
     ]
    }
   ],
   "source": [
    "import xgboost as xgb\n",
    "xgb_model = xgb.XGBClassifier(\n",
    "    n_estimators=160,\n",
    "    max_depth=4,\n",
    "    learning_rate=0.18)\n",
    "xgb_model.fit(X,y)\n",
    "# 预测样本的各类标签（这里是0和1）的概率\n",
    "xgb_model.predict_proba(X_test)\n",
    "# 预测标签为1的概率\n",
    "y_predict = xgb_model.predict_proba(X_test)[:,1]\n",
    "# AUC值，验证集上的性能结果\n",
    "y_auc = roc_auc_score(y_test,y_predict)\n",
    "print('auc',y_auc)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:22.134306Z",
     "start_time": "2024-09-23T13:46:21.764621Z"
    }
   },
   "id": "5af728ffd61d8b49"
  },
  {
   "cell_type": "code",
   "execution_count": 603,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\86183\\AppData\\Local\\Temp\\ipykernel_17896\\3157569295.py:5: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  test_result['Probability'] = result\n"
     ]
    },
    {
     "data": {
      "text/plain": "array([0.1392725 , 0.30556968, 0.25180763, ..., 0.36958173, 0.75874686,\n       0.7051635 ], dtype=float32)"
     },
     "execution_count": 603,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预测给定的测试集\n",
    "pre_test = new_test_data[features]\n",
    "result = xgb_model.predict_proba(pre_test)[:,1]\n",
    "test_result = new_test_data[['User_id','Coupon_id','Date_received']]\n",
    "test_result['Probability'] = result\n",
    "result"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:22.196485900Z",
     "start_time": "2024-09-23T13:46:22.137298500Z"
    }
   },
   "id": "2b3082251789082b"
  },
  {
   "cell_type": "code",
   "execution_count": 604,
   "outputs": [],
   "source": [
    "# 查看描述性结果\n",
    "test_result['Probability'].describe()\n",
    "test_result.to_csv('submit1.csv',index=None,header=None)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2024-09-23T13:46:22.415561500Z",
     "start_time": "2024-09-23T13:46:22.198482200Z"
    }
   },
   "id": "3f5dd75b6bc35d87"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
